package com.shujia.scala

object Demo15ScalaFunc4 {
  /**
   * 2、以函数作为返回值
   *
   */
  def main(args: Array[String]): Unit = {

    // "100" "200"
    val f2: String => Int = func1("100") // 返回了一个函数
    val i: Int = f2("200")
    println(i)
    println(func3(2, 3))
    println(func3(3, 3))
    println(func3(4, 3))
    println(func3(5, 3))

    // 偏函数：将有X个参数的函数 变成X-N个参数的函数 N表示传入的固定参数
    println(func3(2))

    val f4: Int => Double = func4(3)
    println(f4(2))
    println(f4(3))
    println(f4(4))
    println(f4(5))

    val f5: Int => Double = func5(3)
    println(f5(2))
    println(f5(3))
    println(f5(4))
    println(f5(5))

    // 直接调用
    println(func4(2)(3))
    println(func4(3)(3))
    println(func4(4)(3))

    println(func5(2)(3))
    println(func5(3)(3))
    println(func5(4)(3))

  }

  // 如果以函数最为返回值 需要手动给定返回值类型
  def func1(str1: String): String => Int = {
    def func2(str2: String) = {
      str1.toInt + str2.toInt
    }

    func2
  }

  // 计算 a的b次方
  def func3(a: Int, b: Int = 3) = {
    Math.pow(a, b)
  }

  def func4(b: Int): Int => Double = {
    def func4_1(a: Int) = {
      Math.pow(a, b)
    }

    func4_1
  }

  // func4 省略的写法
  // 函数柯里化：将一个有N个参数的函数 变成 N个只有一个参数的函数
  def func5(b: Int)(a: Int): Double = {
    Math.pow(a, b)
  }

}
